<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: Perl 接口</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/if_perl.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>if_perl</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="if_perl.txt">if_perl.txt</a> </b>   适用于 Vim 9.0 版本。   最近更新: 2022年7月


                  <code class="vim">VIM 参考手册    by Sven Verdoolaege</code>
                                         and Matt Gerassimof
                                <code class="vim">译者</code>: foolstone@ustc.edu、Willis、tocer


Perl 与 Vim                                             <b class="vimtag"> <a name="perl">perl</a> </b> <b class="vimtag"> <a name="Perl">Perl</a> </b>

1. 编辑 Perl 文档                <a href="if_perl.html#perl-editing">perl-editing</a> 
2. 编译带 Perl 接口的 Vim        <a href="if_perl.html#perl-compiling">perl-compiling</a> 
3. Perl 接口的使用               <a href="if_perl.html#perl-using">perl-using</a> 
4. 动态调入                      <a href="if_perl.html#perl-dynamic">perl-dynamic</a> 

<code class="notvi">{仅当编译 Vim 时加入  <a href="various.html#+perl">+perl</a>  特性才有效}</code>

</section><hr class="doubleline" /><section class=inner>
<h4>1. 编辑 Perl 文件                                       <b class="vimtag"> <a name="perl-editing">perl-editing</a> </b></h4>
Vim 语法高亮显示支持 Perl 和 POD 文件。Vim 假设后缀为 .pl 和 .pm 的文件是 Perl
文件。Vim 同时不管文件后缀而测试文件的首行来检查一个文件是否为 Perl 脚本 (参见
Vim 的 syntax 目录下的 scripts.vim)。Vim 假设带后缀 .POD 的文件是 POD 文本。

要使用 Perl 标签，你需要 Universal/Exuberant ctags。在这里可以找到:
        Universal Ctags (推荐): <a href="https://ctags.io">https://ctags.io</a>
        Exuberant Ctags: <a href="http://ctags.sourceforge.net">http://ctags.sourceforge.net</a>

当然，作为选择你还可以用一个叫 pltags.pl 的 Perl 脚本，它和 Vim 一起发行的，位
于 $VIMRUNTIME/tools 目录下。这个脚本比 Exuberant ctags 的 Perl 支持具备更多的
功能。

</section><hr class="doubleline" /><section class=inner>
<h4>2. 编译带 Perl 接口的 Vim                               <b class="vimtag"> <a name="perl-compiling">perl-compiling</a> </b></h4>
为了编译带 Perl 接口的 Vim，需要 Perl 5.004 (或者更新) 的版本。Perl 必须在你编
译 Vim 前安装。 Vim 的 Perl 接口 <code class="emphasis">不能</code> 和官方发行的 Perl 5.003 一起正常工作！它
也许能和 Perl 5.003_05 或者更新版本一起正常工作。
_[<code class="vim">译者注</code>]到翻译的时候，这个问题已经不会是大问题了_

Vim 的 Perl 补丁由
        Sven Verdoolaege&lt;skimo@breughel.ufsia.ac.be&gt; 和
        Matt Gerassimof
制作。

Perl 的 MS-Windows (和其它平台) 版本可以在下面这个网址找到:
        <a href="http://www.perl.org/">http://www.perl.org/</a>
ActiveState 的版本应该可用，Strawberry Perl 是另一个好的版本。

</section><hr class="doubleline" /><section class=inner>
<h4>3. Perl 接口的使用                                      <b class="vimtag"> <a name="perl-using">perl-using</a> </b></h4>
                                                        <b class="vimtag"> <a name=":perl">:perl</a> </b> <b class="vimtag"> <a name=":pe">:pe</a> </b>
:pe[rl] <code class="special">{cmd}</code>           执行 Perl 命令 <code class="special">{cmd}</code>。当前包是 "main"。测试  <a href="if_perl.html#:perl">:perl</a>  是
                        否可用的简单例子: 
<code class="example">                                :perl VIM::Msg("Hello")</code>
<code class="example"></code>
:pe[rl] &lt;&lt; <code class="special">[trim]</code> [<code class="special">{endmarker}</code>]
<code class="special">{script}</code>
<code class="special">{endmarker}</code>
                        执行 Perl 脚本 <code class="special">{script}</code>。
                        <code class="special">{script}</code> 之下的 <code class="special">{endmarker}</code>  <code class="emphasis">不能</code> 有任何前导空白。

                        如果省略了 <code class="special">[endmarker]</code>，默认为一个点号 '.'，就会像
                         <a href="insert.html#:append">:append</a>  和  <a href="insert.html#:insert">:insert</a>  命令那样。在函数内使用时，最好
                        指明 '.'，因为 "$i;" 看起来像 Vim 的  <a href="insert.html#:insert">:insert</a>  命令的
                        开始。

                         <a href="if_perl.html#:perl">:perl</a>  命令的这种形式主要是用来在 vim 脚本里面包含
                        perl 代码。
                        <code class="note">备注</code>: 当 Perl 特性没有被编译进 vim 时这条命令不能工
                        作。为了避免出错，请参考  <a href="if_perl.html#script-here">script-here</a> 。
vim 脚本示例: 
<code class="example"></code>
<code class="example">        function! WhitePearl()</code>
<code class="example">        perl &lt;&lt; EOF</code>
<code class="example">                VIM::Msg("pearls are nice for necklaces");</code>
<code class="example">                VIM::Msg("rubys for rings");</code>
<code class="example">                VIM::Msg("pythons for bags");</code>
<code class="example">                VIM::Msg("tcls????");</code>
<code class="example">        EOF</code>
<code class="example">        endfunction</code>

要看运行的 Perl 的版本: 
<code class="example">        :perl print $^V</code>


                                                        <b class="vimtag"> <a name=":perldo">:perldo</a> </b> <b class="vimtag"> <a name=":perld">:perld</a> </b>
:<code class="special">[range]</code>perld[o] <code class="special">{cmd}</code>  对 <code class="special">[range]</code> 中的每行执行 Perl 命令 <code class="special">{cmd}</code>，同时 $_ 依次
                        被赋值为每行的文本，但不包括行尾的 <code class="special">&lt;EOL&gt;</code>。改变 $_ 会改
                        变每行的内容，但<code class="note">注意</code>不能用这个命令添加或者删除行。
                        <code class="special">[range]</code> 的缺省值是整个文件: "1，$"。

可以试一下下面的代码: 
<code class="example"></code>
<code class="example">  :perl $a=1</code>
<code class="example">  :perldo $_ = reverse($_);1</code>
<code class="example">  :perl VIM::Msg("hello")</code>
<code class="example">  :perl $line = $curbuf-&gt;Get(42)</code>
                                                        <b class="vimtag"> <a name="E299">E299</a> </b>
在沙盘  <a href="eval.html#sandbox">sandbox</a>  里执行 Perl 命令是受限制的。":perldo" 根本就不能执行。如果可
能，":perl" 会在安全环境下被执行。

                                                        <b class="vimtag"> <a name="perl-overview">perl-overview</a> </b>
下面是在 Perl 下可用的函数概要: 
<code class="example"></code>
<code class="example">  :perl VIM::Msg("Text")                # 显示信息</code>
<code class="example">  :perl VIM::Msg("Wrong!", "ErrorMsg")  # 显示错误信息</code>
<code class="example">  :perl VIM::Msg("remark", "Comment")   # 显示高亮的信息</code>
<code class="example">  :perl VIM::SetOption("ai")            # 设定一个 vim 选项</code>
<code class="example">  :perl $nbuf = VIM::Buffers()          # 返回缓冲区的个数</code>
<code class="example">  :perl @buflist = VIM::Buffers()       # 返回所有缓冲区的数组</code>
<code class="example">  :perl $mybuf = (VIM::Buffers('qq.c'))[0] # 返回一个 'qq.c' 的缓冲区对象</code>
<code class="example">  :perl @winlist = VIM::Windows()       # 返回所有窗口的数组</code>
<code class="example">  :perl $nwin = VIM::Windows()          # 返回窗口的个数</code>
<code class="example">  :perl ($success, $v) = VIM::Eval('&amp;path') # $v: 'path' 选项值，$success: 1</code>
<code class="example">  :perl ($success, $v) = VIM::Eval('&amp;xyz')  # $v: '' 而 $success: 0</code>
<code class="example">  :perl $v = VIM::Eval('expand("&lt;cfile&gt;")') # 展开文件 &lt;cfile&gt;</code>
<code class="example">  :perl $curwin-&gt;SetHeight(10)          # 设定窗口高度</code>
<code class="example">  :perl @pos = $curwin-&gt;Cursor()        # 返回坐标 (row，col) 数组</code>
<code class="example">  :perl @pos = (10, 10)</code>
<code class="example">  :perl $curwin-&gt;Cursor(@pos)           # 把光标位置设为 @pos</code>
<code class="example">  :perl $curwin-&gt;Cursor(10,10)          # 把光标位置设为第 10 行第 10 列</code>
<code class="example">  :perl $mybuf = $curwin-&gt;Buffer()      # 返回窗口的缓冲区对象</code>
<code class="example">  :perl $curbuf-&gt;Name()                 # 返回缓冲区名字</code>
<code class="example">  :perl $curbuf-&gt;Number()               # 返回缓冲区编号</code>
<code class="example">  :perl $curbuf-&gt;Count()                # 返回行数</code>
<code class="example">  :perl $l = $curbuf-&gt;Get(10)           # 返回第 10 行</code>
<code class="example">  :perl @l = $curbuf-&gt;Get(1 .. 5)       # 返回第 1 到第 5 行</code>
<code class="example">  :perl $curbuf-&gt;Delete(10)             # 删除第 10 行</code>
<code class="example">  :perl $curbuf-&gt;Delete(10, 20)         # 删除第 10-20 行</code>
<code class="example">  :perl $curbuf-&gt;Append(10, "Line")     # 添加一行</code>
<code class="example">  :perl $curbuf-&gt;Append(10, "Line1", "Line2", "Line3") # 添加三行</code>
<code class="example">  :perl @l = ("L1", "L2", "L3")</code>
<code class="example">  :perl $curbuf-&gt;Append(10, @l)         # 添加 L1，L2 和 L3</code>
<code class="example">  :perl $curbuf-&gt;Set(10, "Line")        # 替换第 10 行</code>
<code class="example">  :perl $curbuf-&gt;Set(10, "Line1", "Line2")      # 替换第 10 行和第 11 行</code>
<code class="example">  :perl $curbuf-&gt;Set(10, @l)            # 分别用 L1，L2 和 L3 替换 10-12 行</code>

                                                        <b class="vimtag"> <a name="perl-Msg">perl-Msg</a> </b>
VIM::Msg(<code class="special">{msg}</code>, <code class="special">{group}</code>?)
                        显示消息 <code class="special">{msg}</code>。可选 <code class="special">{group}</code> 参数指定用来显示这个消息
                        的高亮方式。

                                                        <b class="vimtag"> <a name="perl-SetOption">perl-SetOption</a> </b>
VIM::SetOption(<code class="special">{arg}</code>)
                        设置一个 vim 选项。<code class="special">{arg}</code> 可以是任何 ":set" 命令能接受
                        的参数。这就意味着参数里面不允许有空格！见  <a href="options.html#:set">:set</a> 。

                                                        <b class="vimtag"> <a name="perl-Buffers">perl-Buffers</a> </b>
VIM::Buffers([<code class="special">{bn}</code>...]) 没有参数的时候，在数组上下文里面返回所有缓冲区的列表，
                        在标量上下文里返回缓冲区的个数。对于一个缓冲区名字或者
                        编号的列表 <code class="special">{bn}</code>，返回匹配 <code class="special">{bn}</code> 的缓冲区列表，与 Vim 内
                        部函数  <a href="builtin.html#bufname()">bufname()</a>  使用同样的规则。
                        <code class="note">警告</code>: 使用  <a href="windows.html#:bwipe">:bwipe</a>  后，该列表就不合法了。如果要强行使
                        用会使 Vim 崩溃。

                                                        <b class="vimtag"> <a name="perl-Windows">perl-Windows</a> </b>
VIM::Windows([<code class="special">{wn}</code>...]) 没有参数的时候，在数组上下文里面返回所有窗口的列表，在
                        标量上下文里返回窗口的个数。对于一个窗口编号的列表
                        <code class="special">{wn}</code>，返回匹配 <code class="special">{wn}</code> 的窗口列表。
                        <code class="note">警告</code>: 窗口关闭后，该列表就不合法了。如果要强行使用会使
                        Vim 崩溃。

                                                        <b class="vimtag"> <a name="perl-DoCommand">perl-DoCommand</a> </b>
VIM::DoCommand(<code class="special">{cmd}</code>)   执行 Ex 命令 <code class="special">{cmd}</code>。

                                                        <b class="vimtag"> <a name="perl-Eval">perl-Eval</a> </b>
VIM::Eval(<code class="special">{expr}</code>)       对 <code class="special">{expr}</code> 求值并在列表上下文返回 (success，value)，在
                        标量上下文则只返回 value。
                        success=1 表示 val 包含 <code class="special">{expr}</code> 的值。success=0 表示表
                        达式求值失败。'@x' 返回寄存器 x 的内容，'&amp;x' 返回选项
                        x 的值，'x' 返回内部变量 x 的值，'$x' 等价于 perl
                        中的 $ENV<code class="special">{x}</code>。所有在命令行可以访问的函数都可用于
                        <code class="special">{expr}</code>。
                        列表  <a href="eval.html#List">List</a>  通过连接项目并在项目间插入换行符来转化为字
                        符串。

                                                        <b class="vimtag"> <a name="perl-Blob">perl-Blob</a> </b>
VIM::Blob(<code class="special">{expr}</code>)       返回来自标量值的  <a href="eval.html#Blob">Blob</a>  字面常量字符串 0zXXXX。

                                                        <b class="vimtag"> <a name="perl-SetHeight">perl-SetHeight</a> </b>
Window-&gt;SetHeight(<code class="special">{height}</code>)
                        把窗口的高度设定为 <code class="special">{height}</code>，不超过屏幕范围。

                                                        <b class="vimtag"> <a name="perl-GetCursor">perl-GetCursor</a> </b>
Window-&gt;Cursor(<code class="special">{row}</code>?, <code class="special">{col}</code>?)
                        在没有参数的情况下，返回窗口光标所处位置的坐标 (row，
                        col) 数组。当有参数 <code class="special">{row}</code> 和 <code class="special">{col}</code> 的情况下，把窗口光
                        标的位置设为 <code class="special">{row}</code> 和 <code class="special">{col}</code>。<code class="note">注意</code> <code class="special">{col}</code> 是按 Perl 风格
                        从0 数起的，比 Vim 的尺度小 1。

Window-&gt;Buffer()                                        <b class="vimtag"> <a name="perl-Buffer">perl-Buffer</a> </b>
                        返回给定窗口的缓冲区对象。

                                                        <b class="vimtag"> <a name="perl-Name">perl-Name</a> </b>
Buffer-&gt;Name()          返回缓冲区的文件名。

                                                        <b class="vimtag"> <a name="perl-Number">perl-Number</a> </b>
Buffer-&gt;Number()        返回缓冲区的编号。

                                                        <b class="vimtag"> <a name="perl-Count">perl-Count</a> </b>
Buffer-&gt;Count()         返回缓冲区中的行数。

                                                        <b class="vimtag"> <a name="perl-Get">perl-Get</a> </b>
Buffer-&gt;Get(<code class="special">{lnum}</code>, <code class="special">{lnum}</code>?, ...)
                        对每个指定的 <code class="special">{lnum}</code>，返回缓冲区中第 <code class="special">{lnum}</code> 行的文本字
                        符串。通过指定一个 <code class="special">{lnum}</code> 列表可以传递一个数组。

                                                        <b class="vimtag"> <a name="perl-Delete">perl-Delete</a> </b>
Buffer-&gt;Delete(<code class="special">{lnum}</code>, <code class="special">{lnum}</code>?)
                        删除缓冲区的第 <code class="special">{lnum}</code> 行。当有第二个参数 <code class="special">{lnum}</code> 时，删
                        除由第一个 <code class="special">{lnum}</code> 到第二个 <code class="special">{lnum}</code> 指定的范围。

                                                        <b class="vimtag"> <a name="perl-Append">perl-Append</a> </b>
Buffer-&gt;Append(<code class="special">{lnum}</code>, <code class="special">{line}</code>, <code class="special">{line}</code>?, ...)
                        把每个 <code class="special">{line}</code> 字符串添加到缓冲区的第 <code class="special">{lnum}</code> 行后面。
                        <code class="special">{line}</code> 列表可以是一个数组。

                                                        <b class="vimtag"> <a name="perl-Set">perl-Set</a> </b>
Buffer-&gt;Set(<code class="special">{lnum}</code>, <code class="special">{line}</code>, <code class="special">{line}</code>?, ...)
                        替代缓冲区从第 <code class="special">{lnum}</code> 行开始，由 <code class="special">{line}</code> 指定的一行或者
                        多行。 <code class="special">{line}</code> 列表可以是一个数组。如果参数无效，就不作
                        替代。
$main::curwin
                        当前窗口对象。
$main::curbuf
                        当前缓冲区对象。

                                                        <b class="vimtag"> <a name="script-here">script-here</a> </b>
当使用嵌入式脚本语言时，你可能想在语言不支持时跳过这些语言的代码。但是以下机制
不能工作: 
<code class="example">   if has('perl')</code>
<code class="example">     perl &lt;&lt; EOF</code>
<code class="example">       this will NOT work!</code>
<code class="example">   EOF</code>
<code class="example">   endif</code>
相反，应把 Perl / Python / Ruby 等的命令放在一个函数里面并调用它: 
<code class="example">    if has('perl')</code>
<code class="example">      function DefPerl()</code>
<code class="example">        perl &lt;&lt; EOF</code>
<code class="example">          this works</code>
<code class="example">    EOF</code>
<code class="example">      endfunction</code>
<code class="example">      call DefPerl()</code>
<code class="example">    endif</code>
<code class="note">备注</code>: "EOF" 必须在行首 (前面不能有前导空格)。

</section><hr class="doubleline" /><section class=inner>
<h4>4. 动态调入                                             <b class="vimtag"> <a name="perl-dynamic">perl-dynamic</a> </b></h4>
MS-Windows 和 Unix 上，可以动态调入 Perl 库。 <a href="various.html#:version">:version</a>  输出这时应包括
 <a href="various.html#+perl%2Fdyn">+perl/dyn</a> 。

这意味着 Vim 只有在必要时才寻找 Perl DLL 或共享库文件。如果不使用 Perl 接口，
你就不需要它。这样，即使没有该文件，你也可使用 Vim。


<code class="section">MS-Windows </code>

你可以从 <a href="http://www.perl.org">http://www.perl.org</a> 下载 Perl。用于编译 Vim 的是 ActiveState 提供的版
本。

要使用 Perl 接口，Perl DLL 必须在搜索路径上。
如果 Vim 报告找不到 perl512.dll，确保 $PATH 包含该文件所在的路径。Perl 安装程
序通常会做好这一点。
控制台窗口里输入 "path" 可以看到 (搜索路径) 当前使用的目录。也可以用 <a href="options.html#'perldll'">'perldll'</a>
选项指定 Perl DLL。

DLL 名必须匹配 Vim 编译时所使用的 Perl 版本。目前，该名字为 "perl512.dll"，也
就是 Perl 5.12。要确信这一点，编辑 "gvim.exe" 文件并查找 "perl\d*.dll\c"。


<code class="section">Unix </code>

<a href="options.html#'perldll'">'perldll'</a> 选项可用来指定 Perl 共享库文件，而不用编译时指定的 DYNAMIC_PERL_DLL
文件。共享库的版本必须和 Vim 编译使用的 Perl 版本保持一致。

</section><hr class="doubleline" /><section class=inner>
<h4> vim:tw=78:ts=8:noet:ft=help:norl:</h4></section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
